﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using Model;

namespace BusinessObject
{
    public class HistoryBO : Repository<History>
    {
        #region Singleton

        private static readonly HistoryBO _instance = new HistoryBO();

        /// <summary>
        /// Instância do objeto singleton.
        /// </summary>
        public static HistoryBO Instance
        {
            get { return _instance; }
        }

        private HistoryBO() { }

        #endregion Singleton

        /// <summary>
        /// Este método faz o import de BackLogItem de acordo com o projeto passado.
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public bool Import(HttpPostedFile file, Project project)
        {
            if (!string.IsNullOrEmpty(file.FileName))
            {
                try
                {
                    //Lê o arquivo inteiro, pois se der um exception os dados restantes não seram lidos.
                    using (StreamReader sr = new StreamReader(file.InputStream))
                    {
                        String line;

                        while ((line = sr.ReadLine()) != null)
                        {
                            IList<string> lineObject;

                            History history = new History();

                            //aqui dever ser entre plic's pois é do tipo char o separador.
                            lineObject = line.Split(';');

                            //os atributos são na ordem do template do arquivo
                            history.Project = project;
                            history.Nome = lineObject[0];
                            history.Descricao = lineObject[1];
                            if (!(lineObject[2] == String.Empty))
                                history.MelhorCaso = Double.Parse(lineObject[2]);
                            if (!(lineObject[3] == String.Empty))
                                history.CasoMedio = Double.Parse(lineObject[3]);
                            if (!(lineObject[4] == String.Empty))
                                history.PiorCaso = Double.Parse(lineObject[4]);

                            //grava o objeto
                            HistoryBO.Instance.Save(history);
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("O Arquivo" + file.FileName + " não pode ser lido. Erro: " + e.Message);
                }
            }

            return true;
        }

        public IList<History> GetHistoryBySprint(Sprint sprint)
        {
            return base.GetByCriteria(h => h.Sprint.Id == sprint.Id);
        }

        public IList<History> GetHistoryByProject(Project project)
        {
            return base.GetByCriteria(h => h.Project.Id == project.Id);
        }

        public IList<History> GetHistoryByEpic(Epic epic)
        {
            return base.GetByCriteria(h => h.Epic.Id == epic.Id);
        }

        public IList<History> GetHistoryWithoutEpic()
        {
            return base.GetByCriteria(h => h.Epic == null);
        }

        public IList<History> getHistoryByIds(IList<int> ids)
        {
            IList<History> historias = new List<History>();
            foreach (int id in ids)
            {
                historias.Add(base.GetById(id));
            }
            return historias;
        }

        public object GetHistoryByOrWithoutSprint(Sprint sprint)
        {
            return base.GetByCriteria(h => h.Sprint.Id == sprint.Id || h.Sprint == null);
        }
    }
}